template< typename T, unsigned int R, unsigned int C >
Vector<T,C>& operator*=( Vector<T,C>& a, const Matrix<T,R,C>& b ) {
  return a =b*a;
}

template< typename T, unsigned int R, unsigned int C >
Vector<T,C> operator*( const Matrix<T,R,C>& a, const Vector<T,C>& b ) {
  Vector<T,C> temp;
  for( unsigned int i = 0; i < R; ++i ) {
    for( unsigned int k = 0; k < C; ++k ) {
      temp[i] += a[i][k] * b[k];
    }
  }
  return temp;
}

template< typename T, unsigned int R, unsigned int C >
Vector<T,C> operator*( const Vector<T,C>& a, const Matrix<T,R,C>& b ) {
  return b*a;
}
